package cn.edu.nuc.thrid.services.impl;

import static org.hamcrest.CoreMatchers.sameInstance;

import java.sql.SQLException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cn.edu.nuc.thrid.dao.CartMapper;
import cn.edu.nuc.thrid.dao.GoodsMapper;
import cn.edu.nuc.thrid.model.BuyMes;
import cn.edu.nuc.thrid.model.Cart;
import cn.edu.nuc.thrid.model.Goods;
import cn.edu.nuc.thrid.services.interfaces.CartService;

@Service
public class CartServiceImpl implements CartService {

	@Autowired
	private CartMapper mapper;

	@Autowired
	private GoodsMapper gmapper;

	/**
	 * 根据商品是否已添加过来进行 数据库更新或者添加操作
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED, // 事务传播行为
			noRollbackFor = { NullPointerException.class }, // 当发生这些异常时,不回滚事务
			rollbackFor = { SQLException.class }, // 当发生这些异常时,回滚事务
			timeout = 20, // 超时. 当此事务耗时达到20秒时,结束此事务
			isolation = Isolation.READ_COMMITTED // 设置隔离级别。 未设置以数据库隔离级别为准
	)
	public Integer addCart(Cart cart) {

		Cart c = mapper.findById(cart);

		Goods goods = gmapper.selectByPrimaryKey(cart.getZybgoodid());

		// 判断库存中的数量在添加的时候 超过了库存

		Integer result;
		if (c != null) {

			if (goods.getZybquantity() < (c.getZybnumber() + cart.getZybnumber())) {

				return -1;
			} else {
				result = mapper.updateById(cart);
			}
		} else {

			if (goods.getZybquantity() < cart.getZybnumber()) {

				return -1;
			} else {
				result = mapper.insert(cart);
			}
		}
		return result;
	}

	/**
	 * 返回列表
	 */
	@Override
	public List<BuyMes> cartList(String zybuserid) {

		List<BuyMes> list = mapper.findCartList(Integer.parseInt(zybuserid));

		return list;
	}

	/**
	 * 更新库存
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED, // 事务传播行为
			noRollbackFor = { NullPointerException.class }, // 当发生这些异常时,不回滚事务
			rollbackFor = { SQLException.class }, // 当发生这些异常时,回滚事务
			timeout = 20, // 超时. 当此事务耗时达到20秒时,结束此事务
			isolation = Isolation.READ_COMMITTED // 设置隔离级别。 未设置以数据库隔离级别为准
	)
	public Integer result(Goods goods) {

		Goods g = gmapper.selectByPrimaryKey(Integer.parseInt(goods.getZybgoodid()));
		if ((g.getZybquantity() - goods.getZybquantity()) < 0) {

			return -1;
		}
		Integer result = mapper.update(goods);
		return result;
	}

	/**
	 * 清空购物车
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED, // 事务传播行为
			noRollbackFor = { NullPointerException.class }, // 当发生这些异常时,不回滚事务
			rollbackFor = { SQLException.class }, // 当发生这些异常时,回滚事务
			timeout = 20, // 超时. 当此事务耗时达到20秒时,结束此事务
			isolation = Isolation.READ_COMMITTED // 设置隔离级别。 未设置以数据库隔离级别为准
	)
	public Integer deletecart(String zybuserid) {

		Integer id = Integer.parseInt(zybuserid);
		Integer result = mapper.deletecart(id);
		return result;
	}

	/**
	 * 批量结算清空购物车
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED, // 事务传播行为
			noRollbackFor = { NullPointerException.class }, // 当发生这些异常时,不回滚事务
			rollbackFor = { SQLException.class }, // 当发生这些异常时,回滚事务
			timeout = 20, // 超时. 当此事务耗时达到20秒时,结束此事务
			isolation = Isolation.READ_COMMITTED // 设置隔离级别。 未设置以数据库隔离级别为准
	)
	public Integer deletecarts(Integer[] zybgoodid, Integer zybuserid) {

		int num = 0;
		for (int i = 0; i < zybgoodid.length; i++) {

			Integer goodid = zybgoodid[i];
			Integer result = mapper.deletecarts(zybuserid, goodid);
			num += result;
		}
		return num;
	}

	/**
	 * 批量更新库存
	 * 
	 * @return
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED, // 事务传播行为
			noRollbackFor = { NullPointerException.class }, // 当发生这些异常时,不回滚事务
			rollbackFor = { SQLException.class }, // 当发生这些异常时,回滚事务
			timeout = 20, // 超时. 当此事务耗时达到20秒时,结束此事务
			isolation = Isolation.READ_COMMITTED // 设置隔离级别。 未设置以数据库隔离级别为准
	)
	public Integer results(Integer zybgoodid, Integer zybuserid) {

		Cart cart = new Cart();
		cart.setZybgoodid(zybgoodid);
		cart.setZybuserid(zybuserid);
		Cart c = mapper.findById(cart);

		Goods g = gmapper.selectByPrimaryKey(zybgoodid);
		Integer quantity = c.getZybnumber();// 数量
		if ((g.getZybquantity() - quantity) < 0) {

			return -1;
		}
		Goods goods = new Goods();
		goods.setZybgoodid(String.valueOf(zybgoodid));
		goods.setZybquantity(quantity);
		mapper.update(goods);
		return 1;
	}

}
